home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nebula 1
/
Nebula One.iso
/
Financial
/
USDebtWatch
/
Source
/
Controller.m
< prev
next >
Wrap
Text File
|
1995-06-12
|
8KB
|
272 lines
/* Generated by Interface Builder */
/* NeXTSTEP interface by Erik Sowa (sowa@netcom.com) */
/* with help from Garance Alistair Drosehn (gad@eclipse.its.rpi.edu) */
#import <time.h>
#import <defaults.h>
#import <stdlib.h>
#import <strings.h>
#import <appkit/nextstd.h>
#import <appkit/Application.h> /* for loading nibs, etc. */
#import <appkit/Panel.h> /* for Info Panel stuff */
#import <appkit/Form.h> /* computeSCB89Debt writes to a
FormCell */
#import <appkit/TextFieldCell.h> /* for Preference Panel */
#import <dpsclient/dpsclient.h> /* for timed entry stuff */
#import "Controller.h"
/* declarations for xdebt-xcerpt */
typedef double debt_t, pop_t;
extern debt_t national_scb89debt_at();
extern debt_t national_aj92debt_at();
extern pop_t national_pop_at();
extern void debt_to_string();
#define MINUPDATEINTERVAL 1.0 /* Do not update more than once a second. */
#define MAXUPDATEINTERVAL 999.9 /* This limit is arbitrary. String sizes
in setUpdateInterval depend on it. */
@implementation Controller
char buf[255];
void strtoRect( char *, NXRect * );
- appDidInit:sender
{
NXDefaultsVector defaults =
{
{"updateInterval","1.0"}, /* seconds between auto updates */
{"autoUpdate","1"}, /* 1=enabled, 0=disabled */
{"DebtWindowFrame",NULL}, /* location of Debt window */
{"PrefPanelFrame",NULL}, /* location of Preferences panel */
{NULL,NULL}
};
NXRect tframe;
/* Initialize DebtField at startup */
[self computeAJ92Debt:self];
/* register and obtain valid app defaults */
NXRegisterDefaults([NXApp appName],defaults);
if ( NXGetDefaultValue([NXApp appName],"updateInterval") )
{
updateInterval =
atof(NXGetDefaultValue([NXApp appName],"updateInterval"));
updateInterval = MAX(updateInterval,MINUPDATEINTERVAL);
updateInterval = MIN(updateInterval,MAXUPDATEINTERVAL);
/* make sure pref panel reflects interval value.
there must be a better way than making two calls! */
[updateIntervalPrefField setDoubleValue:updateInterval];
[updateIntervalPrefSlider setDoubleValue:updateInterval];
}
if ( NXGetDefaultValue([NXApp appName],"autoUpdate") )
{
autoUpdate = atoi(NXGetDefaultValue([NXApp appName],"autoUpdate"));
if (autoUpdate != 0)
autoUpdate = 1;
/* make sure pref panel reflects auto update state */
[autoUpdatePref setState:autoUpdate];
}
if ( NXGetDefaultValue([NXApp appName],"DebtWindowFrame") )
{
strcpy(buf, NXGetDefaultValue([NXApp appName],"DebtWindowFrame"));
strtoRect(buf, &tframe);
[debtWindow moveTo:tframe.origin.x:tframe.origin.y];
}
if ( NXGetDefaultValue([NXApp appName],"PrefPanelFrame") )
{
strcpy(buf, NXGetDefaultValue([NXApp appName],"PrefPanelFrame"));
strtoRect(buf, &tframe);
[prefPanel moveTo:tframe.origin.x:tframe.origin.y];
}
/* bring main window to front and make it key window.
among other things, this makes it visible (now that we've
processed the defaults setting for where it should appear) */
[debtWindow makeKeyAndOrderFront:self];
/* register timed entry with window server */
updateEntry = DPSAddTimedEntry(updateInterval,(void *)_update,
self,NX_BASETHRESHOLD);
return self;
}
- appWillTerminate:sender
{
if ( updateEntry )
{
DPSRemoveTimedEntry(updateEntry);
updateEntry = (DPSTimedEntry)0;
}
return self;
}
- setUpdateInterval:sender
{
/* get interval from pref panel field or slider and validate */
updateInterval = [sender doubleValue]; /* from Pref field or slider */
updateInterval = MAX(updateInterval,MINUPDATEINTERVAL);
updateInterval = MIN(updateInterval,MAXUPDATEINTERVAL);
sprintf(buf,"%.1f",updateInterval);
/* %.1f restricts precision, reread it for consistency */
updateInterval = atof(buf);
NXWriteDefault([NXApp appName],"updateInterval",buf);
/* make sure pref panel reflects interval value.
needed because there are two ways to set it.
there must be a better way than making two calls! */
[updateIntervalPrefField setStringValue:buf];
[updateIntervalPrefSlider setStringValue:buf];
/* set up the timed entry */
if (updateEntry)
{
DPSRemoveTimedEntry(updateEntry);
updateEntry = (DPSTimedEntry)0;
}
if (autoUpdate)
{
updateEntry = DPSAddTimedEntry(updateInterval,(void *)_update,
self,NX_BASETHRESHOLD);
}
return self;
}
- setAutoUpdate:sender
{
/* get value from toggle switch button */
autoUpdate = [sender state]; /* check box state (0 or 1) */
sprintf(buf,"%d",autoUpdate);
NXWriteDefault([NXApp appName],"autoUpdate",buf);
/* set up the timed entry */
if (updateEntry)
{
DPSRemoveTimedEntry(updateEntry);
updateEntry = (DPSTimedEntry)0;
}
if (autoUpdate)
{
updateEntry = DPSAddTimedEntry(updateInterval,(void *)_update,
self,NX_BASETHRESHOLD);
}
return self;
}
- showInfoPanel:sender
{
if ( !infoPanel )
[NXApp loadNibSection:"InfoPanel.nib" owner:self];
[infoPanel makeKeyAndOrderFront:self];
return self;
}
- setWindowLocation:sender
{
NXRect debtFrame, prefFrame;
[debtWindow getFrame:&debtFrame];
sprintf(buf, "x%1.0f y%1.0f w%1.0f h%1.0f",
debtFrame.origin.x, debtFrame.origin.y,
debtFrame.size.width, debtFrame.size.height);
NXWriteDefault([NXApp appName], "DebtWindowFrame", buf);
[prefPanel getFrame:&prefFrame];
sprintf(buf, "x%1.0f y%1.0f w%1.0f h%1.0f",
prefFrame.origin.x, prefFrame.origin.y,
prefFrame.size.width, prefFrame.size.height);
NXWriteDefault([NXApp appName], "PrefPanelFrame", buf);
return self;
}
- computeSCB89Debt:sender
{
time_t now;
debt_t debt;
pop_t pop;
now = time ((time_t*) 0);
debt = national_scb89debt_at(now);
pop = national_pop_at(now);
debt_to_string (debt, buf);
[SCB89DebtString setStringValue:buf];
debt_to_string (debt/pop,buf);
[SCB89ShareString setStringValue:buf];
return self;
}
- computeAJ92Debt:sender
{
time_t now;
debt_t debt;
pop_t pop;
now = time ((time_t*) 0);
debt = national_aj92debt_at(now);
pop = national_pop_at(now);
debt_to_string (debt, buf);
[AJ92DebtString setStringValue:buf];
debt_to_string (debt/pop,buf);
[AJ92ShareString setStringValue:buf];
return self;
}
@end
/* function to convert a character string (a defaults value) into
a NXRect frame. The string is pretty much assumed to be valid,
though some minor amount of checking is done. It accepts two
formats, the one used by NXFontPanelFrame (eg: "68 104 322 329")
and the one used by Cassandra (eg: "x68y104w322h329")
*/
void strtoRect(char * inputString, NXRect * frame)
{
char *start, *next;
frame->origin.y = frame->origin.y = 0.0;
frame->size.width = frame->size.height = 0.0;
start = inputString;
if ( *start == ' ' ) start++;
if ( *start == 'x' ) start++;
if ( *start == '\0' ) return;
frame->origin.x = strtod(start, &next);
if ( start == next ) return;
start = next;
if ( *start == ' ' ) start++;
if ( *start == 'y' ) start++;
if ( *start == '\0' ) return;
frame->origin.y = strtod(start, &next);
if ( start == next ) return;
start = next;
if ( *start == ' ' ) start++;
if ( *start == 'w' ) start++;
if ( *start == '\0' ) return;
frame->size.width = strtod(start, &next);
if ( start == next ) return;
start = next;
if ( *start == ' ' ) start++;
if ( *start == 'h' ) start++;
if ( *start == '\0' ) return;
frame->size.height = strtod(start, &next);
if ( start == next ) return;
return;
}
/* function called by timed entry */
void _update(DPSTimedEntry teNumber,double now,id self)
{
[self computeAJ92Debt:self];
return;
}